Cursor SQL Server-এ এমন একটি ডেটাবেস অবজেক্ট যা একাধিক রেকর্ডের উপর ইটারেট (iterate) করার জন্য ব্যবহৃত হয়। এটি ডেটার উপর একে একে অপারেশন (যেমন: UPDATE, DELETE, SELECT) করার সুযোগ প্রদান করে। যখন আপনি একটি কুয়েরি থেকে একাধিক রেকর্ড নিয়ে কাজ করতে চান, তখন cursor ব্যবহার করা হয়।
এখানে Cursor এর সাধারণ ব্যবহার এবং উদাহরণ দেওয়া হলো:
Cursor তৈরি, ব্যবহার এবং শেষ করা
- Cursor তৈরি করা:
- প্রথমে DECLARE কমান্ড দিয়ে cursor ঘোষণা করতে হবে।
- তারপর, OPEN কমান্ড দিয়ে cursor খুলতে হবে।
- পরবর্তীতে FETCH NEXT কমান্ড দিয়ে cursor এর মধ্যে ইটারেট করতে হবে।
- শেষে, CLOSE এবং DEALLOCATE কমান্ড দিয়ে cursor বন্ধ এবং মুক্ত করতে হবে।
উদাহরণ ১: Cursor ব্যবহার করে সকল কর্মী প্রদর্শন
ধরা যাক, আমাদের একটি Employees টেবিল আছে, যেখানে কর্মীদের তথ্য রয়েছে, এবং আমরা cursor ব্যবহার করে তাদের নাম এবং পদের তালিকা দেখাতে চাই।
Step 1: Cursor ঘোষণা এবং ব্যবহার
DECLARE @EmployeeID INT, @EmployeeName NVARCHAR(100), @EmployeePosition NVARCHAR(100);
-- Cursor তৈরি করা
DECLARE EmployeeCursor CURSOR FOR
SELECT EmployeeID, Name, Position FROM Employees;
-- Cursor খোলা
OPEN EmployeeCursor;
-- প্রথম রেকর্ড আনতে FETCH NEXT ব্যবহার করা
FETCH NEXT FROM EmployeeCursor INTO @EmployeeID, @EmployeeName, @EmployeePosition;
-- Loop এর মাধ্যমে সমস্ত রেকর্ড ইটারেট করা
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'EmployeeID: ' + CAST(@EmployeeID AS NVARCHAR) + ', Name: ' + @EmployeeName + ', Position: ' + @EmployeePosition;
-- পরবর্তী রেকর্ডের জন্য FETCH NEXT
FETCH NEXT FROM EmployeeCursor INTO @EmployeeID, @EmployeeName, @EmployeePosition;
END;
-- Cursor বন্ধ করা
CLOSE EmployeeCursor;
-- Cursor মুক্ত করা
DEALLOCATE EmployeeCursor;
এখানে:
- EmployeeCursor নামে একটি cursor তৈরি করা হয়েছে যা
EmployeeID,Name, এবংPositionকলামগুলোর উপর ইটারেট করবে। - FETCH NEXT কমান্ডের মাধ্যমে প্রতিটি রেকর্ডে গিয়ে EmployeeID, Name, এবং Position প্রিন্ট করা হয়েছে।
উদাহরণ ২: Cursor ব্যবহার করে বেতন আপডেট করা
ধরা যাক, আপনি কর্মীদের বেতন আপডেট করতে চান। যদি তাদের Position 'Manager' হয়, তাহলে তাদের বেতন ১০% বাড়াতে হবে। এখানে cursor ব্যবহার করে আমরা এই কাজটি করতে পারি।
DECLARE @EmployeeID INT, @CurrentSalary DECIMAL(10, 2), @NewSalary DECIMAL(10, 2), @Position NVARCHAR(100);
-- Cursor তৈরি করা
DECLARE EmployeeCursor CURSOR FOR
SELECT EmployeeID, Salary, Position FROM Employees;
-- Cursor খোলা
OPEN EmployeeCursor;
-- প্রথম রেকর্ড আনতে FETCH NEXT ব্যবহার করা
FETCH NEXT FROM EmployeeCursor INTO @EmployeeID, @CurrentSalary, @Position;
-- Loop এর মাধ্যমে সমস্ত রেকর্ড ইটারেট করা
WHILE @@FETCH_STATUS = 0
BEGIN
-- যদি কর্মীর পদের নাম 'Manager' হয়, তার বেতন ১০% বাড়ানো
IF @Position = 'Manager'
BEGIN
SET @NewSalary = @CurrentSalary * 1.10; -- ১০% বাড়ানো
UPDATE Employees
SET Salary = @NewSalary
WHERE EmployeeID = @EmployeeID;
END;
-- পরবর্তী রেকর্ডের জন্য FETCH NEXT
FETCH NEXT FROM EmployeeCursor INTO @EmployeeID, @CurrentSalary, @Position;
END;
-- Cursor বন্ধ করা
CLOSE EmployeeCursor;
-- Cursor মুক্ত করা
DEALLOCATE EmployeeCursor;
এখানে:
- EmployeeCursor তৈরি করা হয়েছে যা
EmployeeID,Salary, এবংPositionকলামের উপর ইটারেট করবে। - প্রতিটি কর্মীর Position চেক করা হচ্ছে এবং যদি Manager হয়, তাহলে তার বেতন ১০% বৃদ্ধি করা হচ্ছে।
উদাহরণ ৩: Cursor ব্যবহার করে রেকর্ড ডিলিট করা
ধরা যাক, আপনার Employees টেবিল থেকে সকল কর্মীকে 'Inactive' স্ট্যাটাস দেওয়া হয়েছে এবং আপনি Inactive স্ট্যাটাসের সকল কর্মীকে ডিলিট করতে চান। এখানে cursor ব্যবহার করে এটি করা যাবে।
DECLARE @EmployeeID INT, @Status NVARCHAR(20);
-- Cursor তৈরি করা
DECLARE EmployeeCursor CURSOR FOR
SELECT EmployeeID, Status FROM Employees WHERE Status = 'Inactive';
-- Cursor খোলা
OPEN EmployeeCursor;
-- প্রথম রেকর্ড আনতে FETCH NEXT ব্যবহার করা
FETCH NEXT FROM EmployeeCursor INTO @EmployeeID, @Status;
-- Loop এর মাধ্যমে সমস্ত রেকর্ড ইটারেট করা
WHILE @@FETCH_STATUS = 0
BEGIN
-- Inactive স্ট্যাটাসের কর্মী ডিলিট করা
DELETE FROM Employees WHERE EmployeeID = @EmployeeID;
-- পরবর্তী রেকর্ডের জন্য FETCH NEXT
FETCH NEXT FROM EmployeeCursor INTO @EmployeeID, @Status;
END;
-- Cursor বন্ধ করা
CLOSE EmployeeCursor;
-- Cursor মুক্ত করা
DEALLOCATE EmployeeCursor;
এখানে:
- EmployeeCursor তৈরি করা হয়েছে যেটি শুধুমাত্র Inactive স্ট্যাটাসের কর্মীদের নির্বাচন করবে।
- পরে, সেই কর্মীদের DELETE করে ডিলিট করা হয়েছে।
Cursor এর ব্যবহার কবে উপযুক্ত?
- Cursor সাধারণত তখন ব্যবহার করা হয় যখন আপনাকে একাধিক রেকর্ডের উপর একের পর এক অপারেশন করতে হয়, যা set-based অপারেশন দ্বারা সহজে করা সম্ভব নয়।
- তবে, Cursor ব্যবহারের সময় মনে রাখতে হবে যে এটি ডেটাবেসের পারফরম্যান্সে প্রভাব ফেলতে পারে, বিশেষ করে যখন রেকর্ডের সংখ্যা বড় হয়।
- সাধারনত, যখন set-based অপারেশন ব্যবহার করা সম্ভব, তখন তা Cursor ব্যবহার করার চেয়ে অনেক দ্রুত এবং দক্ষ হয়।
সারাংশ
- Cursor হল SQL-এ ডেটার উপর একে একে কাজ করার একটি উপায়, যা একাধিক রেকর্ডের উপর ক্রমাগত অপারেশন করতে ব্যবহৃত হয়।
- এটি তৈরি, খুলতে, চলমান রাখতে এবং শেষ করতে DECLARE, OPEN, FETCH NEXT, CLOSE, এবং DEALLOCATE কমান্ড ব্যবহার করা হয়।
- Cursor ব্যবহারের প্রধান সুবিধা হলো আপনি ডেটার উপর নিয়ন্ত্রণ রেখে একে একে অপারেশন করতে পারেন, তবে এটি পারফরম্যান্সের উপর কিছুটা প্রভাব ফেলতে পারে এবং set-based অপারেশনগুলির চেয়ে কম কার্যকরী হতে পারে।
Read more